#ifndef CLIENT_H
#define CLIENT_H

#pragma pack(1) // 关闭字节对齐

#define CACHES_MAX (512) // 缓存最大值

#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <iostream>
#include <map>
#include <math.h>
#include <pthread.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <string>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <vector>

using namespace std;

class Client {
  public:
    /***
     * @name 服务参数
     * @description
     * @struct
     */
    typedef struct tagCLIENT {
        int32_t *fd;                         // 服务指针
        pthread_t *tid;                      // 服务ID
        uint32_t *signal;                    // 服务信号
        uint32_t *cacheMax;                  // 缓存最值
        vector< vector< uint8_t > > *caches; // 服务缓存
    } CLIENTPARAM, *HCLIENTPARAM;

    // 析构、构造
    ~Client();
    Client(const string address, const uint16_t port, const uint32_t cacheMax);

    // 接收数据、发送数据
    vector< uint8_t > &read_data();
    Client &write_data(const vector< uint8_t > data);

  private:
    int32_t fd;                         // 服务指针
    pthread_t tid;                      // 服务线程
    uint32_t signal;                    // 服务信号
    uint32_t cacheMax;                  // 缓存最值
    CLIENTPARAM param;                  // 参数
    vector< uint8_t > cache;            // 数据
    vector< vector< uint8_t > > caches; // 缓存
};
#endif